<template>
    <div class="page_root" :key="queryUpdateFlag" data-page-name="1" data-page-identification="x_hb0xe6o0k2">
        <a-spin :spinning="pageLoading.loading" :tip="pageLoading.tip">
            <!-- begin vid_q2pj193dfc 自定义模板_7xu4mdl9mj -->
            <div class="body">
                <div class="top-search">
                    <a-row justify="space-between" :gutter="24">
                        <a-col :span="6">
                            <a-form-item label="区域" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    v-model:value="dataState.filter.areaCodes"
                                    :options="dataState.areaList"
                                    show-search
                                    mode="multiple"
                                    allow-clear
                                    :max-tag-count="1"
                                    placeholder="请选择"
                                    :field-names="{ label: 'label', value: 'value' }"
                                    :filterOption="
                                        (input, option) => {
                                            return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>

                        <a-col :span="6">
                            <a-form-item label="项目总监" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    show-search
                                    allow-clear
                                    mode="multiple"
                                    :max-tag-count="1"
                                    :options="dataState.allUser"
                                    v-model:value="dataState.filter.projectDirectors"
                                    placeholder="请选择"
                                    :field-names="{ label: 'name', value: 'name' }"
                                    :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <a-col :span="6">
                            <a-form-item label="项目经理" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    show-search
                                    allow-clear
                                    :max-tag-count="1"
                                    :options="dataState.allUser"
                                    v-model:value="dataState.filter.pmNames"
                                    placeholder="请选择"
                                    :field-names="{ label: 'name', value: 'name' }"
                                    mode="multiple"
                                    :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <a-col :span="6">
                            <a-form-item label="PMO" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    show-search
                                    allow-clear
                                    :options="dataState.allUser"
                                    v-model:value="dataState.filter.pmoName"
                                    placeholder="请选择"
                                    :field-names="{ label: 'name', value: 'name' }"
                                    :filter-option="
                                        (input, option) => {
                                            return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                                        }
                                    "
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                    </a-row>
                    <a-row justify="space-between" :gutter="24">
                        <a-col :span="6">
                            <a-form-item label="项目阶段" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    allow-clear
                                    show-search
                                    mode="multiple"
                                    :options="dataState.milepostList"
                                    placeholder="请选择"
                                    v-model:value="dataState.filter.milepostNames"
                                    :field-names="{ label: 'itemName', value: 'itemName' }"
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <a-col :span="6">
                            <a-form-item label="自学习宽表天数" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    allow-clear
                                    :options="dataState.zxxSelect"
                                    placeholder="请选择"
                                    v-model:value="dataState.filter.selfLearningDaysCode"
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <a-col :span="6">
                            <a-form-item label="自学习宽表列数" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    allow-clear
                                    :options="dataState.zxxSelect1"
                                    placeholder="请选择"
                                    v-model:value="dataState.filter.selfLearningColumnsCode"
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <a-col :span="6">
                            <a-form-item label="是否验收产线品种" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    allow-clear
                                    :options="[
                                        {
                                            label: '是',
                                            value: '是'
                                        },
                                        {
                                            label: '否',
                                            value: '否'
                                        }
                                    ]"
                                    placeholder="请选择"
                                    v-model:value="dataState.filter.acceptance"
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                    </a-row>
                    <a-row :gutter="24">
                        <a-col :span="6">
                            <a-form-item label="全品工厂培训状态" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">
                                <a-select
                                    allow-clear
                                    :options="[
                                        {
                                            label: '是',
                                            value: '是'
                                        },
                                        {
                                            label: '否',
                                            value: '否'
                                        }
                                    ]"
                                    placeholder="请选择"
                                    v-model:value="dataState.filter.factoryTrainingStatus"
                                    @change="getData"
                                />
                            </a-form-item>
                        </a-col>
                        <!--                        <a-col :span="6">-->
                        <!--                            <a-form-item label="熟料/水泥建模状态" :labelCol="{ span: 8 }" :wrapperCol="{ span: 16 }">-->
                        <!--                                <a-select-->
                        <!--                                    allow-clear-->
                        <!--                                    :options="[-->
                        <!--                                        {-->
                        <!--                                            label: '是',-->
                        <!--                                            value: '是'-->
                        <!--                                        },-->
                        <!--                                        {-->
                        <!--                                            label: '否',-->
                        <!--                                            value: '否'-->
                        <!--                                        }-->
                        <!--                                    ]"-->
                        <!--                                    placeholder="请选择"-->
                        <!--                                    v-model:value="dataState.filter.modelingStatus"-->
                        <!--                                    @change="getData"-->
                        <!--                                />-->
                        <!--                            </a-form-item>-->
                        <!--                        </a-col>-->
                        <a-col :span="6" offset="12" style="display: flex; justify-content: end">
                            <a-button @click="resetData" type="primary" ghost>重置</a-button>
                        </a-col>
                    </a-row>
                </div>
                <div class="kb-table">
                    <div class="kb-title">
                        <div class="kb-title-left"> 数据看板 </div>
                        <a-button type="primary" @click="handleExport" :loading="dataState.exportLoading"
                            >导出</a-button
                        >
                    </div>
                    <a-table
                        bordered
                        :columns="columns"
                        :data-source="dataState.tableData"
                        :scroll="{ x: 'max-content', y: dataState.tableHeight }"
                        :loading="dataState.tableLoading"
                        :pagination="false"
                    >
                        <template #bodyCell="{ record, text, column, index }">
                            <template v-if="column.dataIndex === 'count'">
                                {{ index + 1 }}
                            </template>
                        </template>
                    </a-table>
                </div>
            </div>
            <!-- end vid_q2pj193dfc 自定义模板_7xu4mdl9mj -->
        </a-spin>
    </div>
</template>
<script setup lang="tsx">
    import {
        h,
        ref,
        reactive,
        toRaw,
        markRaw,
        watch,
        computed,
        onBeforeMount,
        onMounted,
        onBeforeUnmount,
        onUnmounted,
        onActivated,
        onDeactivated
    } from 'vue'
    import { useRoute, useRouter } from 'vue-router'
    const router = useRouter()
    const route = useRoute()
    import { get, post, put, del, request, requestWithHeaders } from '@/utils/http/Axios'
    import {
        cloneDeep,
        localGet,
        merge,
        getDifferenceArray,
        traversalTreeStructure,
        checkCaseCondition,
        renderStringInTemplate,
        handleBreadcrumbJump,
        throttle,
        permission,
        getComponentParamsValue
    } from '@/utils/index'
    import { isNullOrEmpty, isEmptyArr, isNullOrUnDef, isContained, isArray, isEmpty, isObject } from '@/utils/is'
    import dayjs from 'dayjs'
    import { getPagePcChartsDataSourceConvert } from '@/utils/chart'
    import { message, notification, Modal } from 'ant-design-vue'
    import {
        propertyFormatByNumber,
        propertyFormatByPercentage,
        propertyFormatByDate,
        parseSubFromDataList
    } from '@/utils/format'
    import colorTheme from '@/design/custom-theme.json'
    /*** PUBLISH_EXEGESIS ***
 import UserTableRecords from '@/model/UserTableRecords';
 import { getAppBaseUrl } from '@/utils/index';
 import { sendToken } from "@/hooks/useIframeToken";
 import { useSystemStore } from "@/store/modules/system";
 const systemStore = useSystemStore();
 *** PUBLISH_EXEGESIS ***/

    // 获取传入的流程ID和组件参数
    const props = defineProps({
        'processInstanceId': {
            type: [String, Number, Boolean],
            default: undefined
        },
        'message': {
            type: [String],
            default: ''
        },
        'projectId': {
            type: [String, Number],
            default: undefined
        }
    })
    const immediateWatch = (source, callback) => {
        watch(source, callback, { deep: true, immediate: true })
    }

    /* -------------------------- 属性定义 -------------------------- */

    const setTimeOutList = []
    const pageLoading = reactive({
        loading: false,
        tip: undefined
    })
    const authInfo = localGet('app-user-store')

    // 处理校验
    const setSubFormName = (parentInfo, name) => {
        return [parentInfo.parents, parentInfo.cycleIndex, name]
    }

    /* ========================== 属性定义 ========================== */

    /* -------------------------- 元素数据引用 -------------------------- */

    /* ========================== 元素数据引用 ========================== */

    /* -------------------------- 页面数据 -------------------------- */

    /* ========================== 页面数据 ========================== */

    /* -------------------------- 响应 -------------------------- */

    /* ========================== 响应 ========================== */

    /* -------------------------- 函数 -------------------------- */

    /* ========================== 函数 ========================== */

    /* -------------------------- 页面参数 -------------------------- */

    const pageParameter_state = reactive({
        'processInstanceId': props.processInstanceId ?? route.query.processInstanceId,
        'abc': undefined,
        'def': undefined
    })

    /* ========================== 页面参数 ========================== */

    /* -------------------------- 组件事件处理方法 -------------------------- */

    // ---------------------------- 组件数据同步 ----------------------------

    // ============================ 组件数据同步 ============================

    /* ========================== 组件事件处理方法 ========================== */

    /* -------------------------- 生命周期 -------------------------- */
    // 用于参数变更后重新执行自定义指令
    const queryUpdateFlag = ref(0)

    const pageParams = [
        { 'name': 'abc', 'dataType': 'STRING' },
        { 'name': 'def', 'dataType': 'STRING' }
    ]
    let setPageParams = () => {
        pageParams.forEach(param => {
            strategyMap[param.dataType](param, route.query[param.name])
        })
    }
    const strategyMap = {
        STRING: (param, paramValue) => {
            if (typeof paramValue === 'undefined') {
                pageParameter_state[param.name] = undefined
                return
            }
            pageParameter_state[param.name] = paramValue
        },
        BOOLEAN: (param, paramValue) => {
            if (typeof paramValue === 'undefined') {
                pageParameter_state[param.name] = undefined
                return
            }
            if ('true' === (paramValue || '').toLowerCase()) {
                pageParameter_state[param.name] = true
            } else if ('false' === (paramValue || '').toLowerCase()) {
                pageParameter_state[param.name] = false
            } else {
                message.error('参数传入错误！类型不匹配！')
            }
        },
        NUMBER: (param, paramValue) => {
            if (typeof paramValue === 'undefined') {
                pageParameter_state[param.name] = undefined
                return
            }
            if (!isNaN(paramValue)) {
                pageParameter_state[param.name] = Number(paramValue)
            } else {
                message.error('参数传入错误！类型不匹配！')
            }
        },
        ARRAY: (param, paramValue) => {
            if (typeof paramValue === 'undefined') {
                pageParameter_state[param.name] = undefined
                return
            }
            if (isNullOrUnDef(paramValue) || !paramValue || paramValue === 'undefined') {
                pageParameter_state[param.name] = []
            } else if (paramValue.trim().startsWith('[') && paramValue.trim().endsWith(']')) {
                try {
                    pageParameter_state[param.name] = JSON.parse(decodeURI(paramValue))
                } catch (error) {
                    console.error('参数解析失败 ', error)
                    message.error('参数解析失败 ', error)
                }
            } else {
                console.error('参数传入错误！类型不匹配！')
                message.error('参数传入错误！类型不匹配！')
            }
        }
    }
    /*** PUBLISH_EXEGESIS ***
 immediateWatch(
 () => route.query,
 () => {
 setPageParams();
 queryUpdateFlag.value++;

 }
 )
 *** PUBLISH_EXEGESIS ***/
    onMounted(() => {
        setPageParams()
    })

    onUnmounted(() => {
        // 销毁定时器
        setTimeOutList.forEach(({ repeat, timer }) => {
            repeat ? clearInterval(timer) : clearTimeout(timer)
        })
    })

    /* ========================== 生命周期 ========================== */

    /* -------------------------- 数据关联处理 -------------------------- */

    /* -------------------------- 表单数据同步 -------------------------- */
    /* ========================== 表单数据同步 ========================== */

    /* ========================== 数据关联处理 ========================== */

    /* -------------------------- 不同组件自定义的处理逻辑 -------------------------- */

    /* ========================== 不同组件自定义的处理逻辑 ========================== */

    // ================================定制化逻辑========================================
    onMounted(() => {
        getAreaList()
        getAllUser()
        getMilepostList()
        getDictionary()
        getData()
    })
    const headerOffset = ref(280)
    const topHeightNum = ref()
    const calcTableHeight = () => {
        dataState.tableHeight = window.innerHeight - 180 - headerOffset.value
    }

    onMounted(() => {
        calcTableHeight()
        window.addEventListener('resize', calcTableHeight)
    })

    onBeforeUnmount(() => {
        window.removeEventListener('resize', calcTableHeight)
    })
    const dataState = reactive({
        filter: {
            areaCodes: undefined,
            projectDirectors: undefined,
            pmNames: undefined,
            pmoName: undefined,
            milepostNames: undefined,
            selfLearningDaysCode: undefined,
            selfLearningColumnsCode: undefined,
            acceptance: undefined,
            factoryTrainingStatus: undefined,
            modelingStatus: undefined
        },
        customSort: { 'sortDirection': 'ASC', 'filed': 'AREA_PROJECT' },
        exportLoading: false,
        areaList: [],
        zxxSelect: [],
        zxxSelect1: [],
        allUser: [],
        milepostList: [],
        tableData: [],
        modalForm: {},
        tableHeight: 420,
        tableLoading: false
    })
    const columns = ref([
        {
            title: '序号',
            dataIndex: 'count',
            align: 'center',
            width: 80
        },
        {
            title: '区域',
            dataIndex: 'areaName',
            align: 'center',
            width: 120,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: areaRowSpan
                }
            }
        },
        {
            title: '工厂名称',
            dataIndex: 'projectShortName',
            align: 'center',
            width: 180,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '项目总监',
            dataIndex: 'projectDirector',
            align: 'center',
            width: 120,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '项目经理',
            dataIndex: 'pmName',
            align: 'center',
            width: 120,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: 'PMO',
            dataIndex: 'pmoName',
            align: 'center',
            width: 140,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '项目阶段',
            dataIndex: 'milepostName',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '项目状态',
            dataIndex: 'projectStatus',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '熟料建模数量',
            dataIndex: 'clinkerModelingNum',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '已完成熟料建模数量',
            dataIndex: 'finishedClinkerModelingNum',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '水泥建模数量',
            dataIndex: 'cementModelingNum',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '已完成水泥建模数量',
            dataIndex: 'finishedCementModelingNum',
            align: 'center',
            width: 160,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        {
            title: '全品工厂培训状态',
            dataIndex: 'factoryTrainingStatus',
            align: 'center',
            width: 200,
            customCell: ({ areaRowSpan, projectRowSpan }) => {
                return {
                    rowSpan: projectRowSpan
                }
            }
        },
        // { title: '任务类型', dataIndex: 'taskType', align: 'center', width: 150 },
        { title: '窑/水泥磨', dataIndex: 'kilnOrCement', align: 'center', width: 150 },
        { title: '熟料/水泥品种', dataIndex: 'clinkerOrCementType', align: 'center', width: 160 },
        { title: '熟料/水泥建模状态', dataIndex: 'modelingStatus', align: 'center', width: 160 },
        { title: '是否验收产线品种', dataIndex: 'acceptance', align: 'center', width: 180 },

        {
            title: '自学习数据',
            children: [
                {
                    title: '宽表天数',
                    dataIndex: 'clinkerDays',
                    align: 'center',
                    width: 140,
                    sorter: (a, b) => a.clinkerDays - b.clinkerDays
                },
                {
                    title: '宽表列数',
                    dataIndex: 'clinkerDcsNums',
                    align: 'center',
                    width: 140,
                    sorter: (a, b) => a.clinkerDcsNums - b.clinkerDcsNums
                },
                {
                    title: '自学习条数',
                    dataIndex: 'studyNums',
                    align: 'center',
                    width: 140,
                    sorter: (a, b) => a.studyNums - b.studyNums
                }
            ]
        },

        {
            title: '水泥',
            children: [
                {
                    title: '3天强度预测合格率',
                    dataIndex: 'cement3dRate',
                    align: 'center',
                    width: 180,
                    sorter: (a, b) => a.cement3dRate - b.cement3dRate
                },
                {
                    title: '28天强度预测合格率',
                    dataIndex: 'cement28dRate',
                    align: 'center',
                    width: 180,
                    sorter: (a, b) => a.cement28dRate - b.cement28dRate
                }
            ]
        },

        {
            title: '熟料',
            children: [
                {
                    title: '3天强度预测合格率',
                    dataIndex: 'clinker3dRate',
                    align: 'center',
                    width: 180,
                    sorter: (a, b) => a.clinker3dRate - b.clinker3dRate
                },
                {
                    title: '28天强度预测合格率',
                    dataIndex: 'clinker28dRate',
                    align: 'center',
                    width: 180,
                    sorter: (a, b) => a.clinker28dRate - b.clinker28dRate
                }
            ]
        }
    ])

    // 区域
    function getAreaList() {
        get('/solution-ppm-work-order/api/v1/work_order/area_info').then(data => {
            if (data.code !== 200) {
                message.error(data.message)
                return
            }
            dataState.areaList = data.data.map(item => {
                return {
                    label: item.areaName,
                    value: item.areaCode
                }
            })
        })
    }
    //     角色
    function getAllUser() {
        get('/solution-ppm/api/v2/built-in-system-ppm/pmgf/get/allUser').then(data => {
            if (data.code !== 200) {
                message.error(data.message)
                return
            }
            dataState.allUser = data.data.userDtoList
        })
    }
    // 项目阶段
    function getMilepostList() {
        get(' /solution-ppm-basic-data/api/v1/dictionary/search/1001.1000').then(data => {
            dataState.milepostList = data.data
        })
    }
    function getDictionary() {
        get(' /solution-ppm-basic-data/api/v1/dictionary/search/ZXX.KBTS').then(data => {
            dataState.zxxSelect = data.data.map(item => {
                return {
                    label: item.itemName,
                    value: item.itemCode
                }
            })
        })
        get(' /solution-ppm-basic-data/api/v1/dictionary/search/ZXX.KBLS').then(data => {
            dataState.zxxSelect1 = data.data.map(item => {
                return {
                    label: item.itemName,
                    value: item.itemCode
                }
            })
        })
    }
    function getData() {
        dataState.tableLoading = true
        post('/solution-ppm/api/v2/built-in-system-ppm/data_dashboard/list', {
            ...dataState.filter,
            customSort: dataState.customSort
        })
            .then(data => {
                if (data.code !== 200) {
                    message.error(data.message)
                    dataState.tableData = []
                    return
                }
                dataState.tableData = groupData(data.data)
            })
            .finally(() => {
                dataState.tableLoading = false
            })
    }
    function resetData() {
        dataState.filter = {
            areaCodes: undefined, //区域
            projectDirectors: undefined, //项目总监
            pmNames: undefined, //项目经理
            pmoName: undefined, //pmo
            milepostNames: undefined, //项目阶段
            selfLearningDaysCode: undefined, //自学习天数
            selfLearningColumnsCode: undefined, //自学习列数
            acceptance: undefined, //是否验收产品线
            factoryTrainingStatus: undefined, //全品工厂培训状态
            modelingStatus: undefined //熟料/水泥建模状态
        }
        getData()
    }
    function handleExport() {
        dataState.exportLoading = true
        post(
            '/solution-ppm/api/v2/built-in-system-ppm/data_dashboard/exportDataDashboardList',
            { ...dataState.filter, customSort: dataState.customSort },
            {
                responseType: 'arraybuffer'
            }
        ).then(data => {
            downloadExcel(data, '数据看板.xlsx')
            dataState.exportLoading = false
        })
    }
    function downloadExcel(response, name) {
        const blob = new Blob([response], {
            type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
        })
        const downloadElement = document.createElement('a')
        const href = window.URL.createObjectURL(blob) // 创建下载的链接
        downloadElement.href = href
        downloadElement.download = name // 下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() // 点击下载
        document.body.removeChild(downloadElement) // 下载完成移除元素
        window.URL.revokeObjectURL(href)
        return href
    }
    function groupData(data) {
        let areaName = ''
        let projectShortName = ''

        return data.map((item, index) => {
            // 处理 areaName 合并
            if (areaName !== item.areaName) {
                areaName = item.areaName
                let areaRowSpan = 0

                for (let i = index; i < data.length; i++) {
                    if (data[i].areaName === areaName) {
                        areaRowSpan++
                    } else {
                        break
                    }
                }
                item.areaRowSpan = areaRowSpan
            } else {
                item.areaRowSpan = 0
            }

            // 处理 projectShortName 合并（在同一个 areaName 范围内）
            if (projectShortName !== item.projectShortName || item.areaRowSpan > 0) {
                projectShortName = item.projectShortName
                let projectRowSpan = 0

                for (let i = index; i < data.length; i++) {
                    if (data[i].areaName === areaName && data[i].projectShortName === projectShortName) {
                        projectRowSpan++
                    } else {
                        break
                    }
                }
                item.projectRowSpan = projectRowSpan
            } else {
                item.projectRowSpan = 0
            }

            return item
        })
    }
</script>
<style lang="less" scoped>
    .page_root {
        width: 100%;
        height: 100%;
        overflow: auto;
    }
    .page_root :deep(.@{ant-prefix}-spin-nested-loading),
    .page_root :deep(.@{ant-prefix}-spin-container) {
        height: 100%;
    }
    .page_root :deep(.@{ant-prefix}-spin-container .@{ant-prefix}-table-wrapper) {
        display: flex;
        flex-flow: column nowrap;
        justify-content: flex-start;
    }
    .page_root :deep(.@{ant-prefix}-table) {
        flex: auto;
        overflow: auto;
    }
    .table-moreBtn_down {
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
        width: 100px;
    }

    .table-moreBtn_menu :deep(.table-moreBtn_menu-item):hover {
        background: #ebf1ff;
    }

    /*  表格树结构样式处理，展开按钮层级增加*/
    :deep(.@{ant-prefix}-table-row-expand-icon) {
        z-index: 1;
    }
    /*  表格树结构 由于每个表格项采用自定义组件，使用绝对定位布局，开启树结构导致显示异常，暂时使用层级定位位置 */
    :deep(.@{ant-prefix}-table-row-level-1 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
        left: 15px !important;
        width: calc(100% - 15px);
    }
    :deep(.@{ant-prefix}-table-row-level-2 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
        left: 30px !important;
        width: calc(100% - 30px);
    }
    :deep(.@{ant-prefix}-table-row-level-3 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
        left: 45px !important;
        width: calc(100% - 45px);
    }
    :deep(.@{ant-prefix}-table-row-level-4 .@{ant-prefix}-table-cell-with-append .cell-wrapper-left) {
        left: 60px !important;
        width: calc(100% - 60px);
    }

    /* 穿梭框改变默认样式，为根据组件样式控制左右栏宽度。 */
    :deep(.@{ant-prefix}-transfer-list) {
        height: 100%;
        width: 50%;
    }
    /*看板*/
    .top-search {
        margin-bottom: 14px;
        padding: 16px 24px;
        padding-bottom: 0;
        background-color: #fff;
    }
    .kb-box {
        padding: 16px 24px;
        background-color: #fff;
        height: 100%;
    }
    .body {
        height: 100%;
    }
    .kb-title {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 16px;
        .kb-title-left {
            font-size: 16px;
            color: #262626;
            letter-spacing: 0;
            font-weight: 600;
            line-height: 16px;
            padding-left: 8px;
            border-left: 4px solid #3875ff;
            height: 16px;
        }
    }
    .kb-table {
        padding: 16px 24px;
        background-color: #fff;
        height: 100%;
    }
    .kb-table:deep(.@{ant-prefix}-table-thead) > tr > th {
        background: #3875ff;
        color: #fff;
        font-weight: 600;
        padding: 8px 16px;
        border-right: 1px solid #d9d9d9 !important;
        position: relative;
    }
    .kb-table :deep(.@{ant-prefix}-table-tbody) tr > td {
        font-size: 14px;
        font-family: arial, helvetica, 'microsoft yahei';
        font-weight: 400;
        color: #262626;
        border-bottom: 1px solid #d9d9d9;
        padding: 8px 4px;
        word-break: break-all;
    }
    .page_root {
        overflow: hidden;
    }
    /*看板*/
</style>
